package sistema.turma.dao;

import java.io.File;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

import sistema.turma.Turma;
import facade.excecoes.ValidacaoException;

/**
 * @author vinicius
 */
public class TurmaXMLDAO implements TurmaDAO {

	private Map<String, Turma> turmas;
	private final String rootDirectory =   "data";	//FIXME: TIRA ISSO DAQUI
	private final String baseFile =   "turmas.xml";//FIXME: TIRA ISSO DAQUI
	
	/**
	 * 
	 *
	 */
	public TurmaXMLDAO() {
		turmas = fromData();
	}
	
	/* (non-Javadoc)
	 * @see sistema.contexto.avaliacao.dao.AvaliacaoDAO#adicionaAvaliacao(sistema.contexto.avaliacao.Avaliacao)
	 */
	public void adicionaTurma(Turma turma) {
		if(containsTurma(turma.getId())) {
			throw new IllegalArgumentException(ValidacaoException.JAH_EXISTE_AVALIACAO);
		}
		turmas.put(turma.getId(), turma);	//id duplicado
		toData(turmas);
	}

	/* (non-Javadoc)
	 * @see sistema.contexto.avaliacao.dao.AvaliacaoDAO#containsAvaliacao(java.lang.String)
	 */
	public boolean containsTurma(String idTurma) {
		return turmas.containsKey(idTurma);//fazer um get Antes ?
	}

	/* (non-Javadoc)
	 * @see sistema.contexto.avaliacao.dao.AvaliacaoDAO#getAvaliacoes()
	 */
	public Collection<Turma> getTurmas() {
		return turmas.values();//fazer um get antes ?
	}
	
	/**
	 * @return
	 */
	private Map fromData() {
		try {
			//TODO FIXME refazer, eh aqui mesmo essa verificacao?
			if(!new File(rootDirectory+File.separator+baseFile).exists()) {
				new File(rootDirectory+File.separator+baseFile).createNewFile();
			}
			return (Map) new TurmaXMLReader().processFile(rootDirectory+File.separator+baseFile);
		} catch (Exception e) {}
		return new HashMap<String, String>(); 
	}
	
	/**
	 * @param turmas
	 */
	private void toData(Map turmas){
		try {
			//TODO FIXME refazer, eh aqui mesmo essa verificacao?
			if(!new File(rootDirectory+File.separator+baseFile).exists()) {
				new File(rootDirectory+File.separator+baseFile).createNewFile();
			}
			new TurmaXMLWritter().processFile(rootDirectory+File.separator+baseFile, turmas);
		} catch (Exception e) {
//			//e.printStackTrace(); //decidir quem vai tratar
		}
	}

	/* (non-Javadoc)
	 * @see sistema.turma.dao.TurmaDAO#zerarDados()
	 */
	public void zerarDados() {
		this.turmas = new HashMap<String,Turma>();
		this.toData(this.turmas);
	}

	/* (non-Javadoc)
	 * @see sistema.turma.dao.TurmaDAO#getTurma(java.lang.String)
	 */
	public Turma getTurma(String idTurma) {
		return turmas.get(idTurma);
	}

}
